const fs = require('fs')
function mineReadFile(path){
    return new Promise((resolve,reject)=>{
        fs.readFile(path,(err,data)=>{
        if (err){
            reject(err)
        }
        resolve(data.toString())
        })
    })
}
//方法一。promise和generator
async(
    function * (){
        console.log('start')
        let fs1 = yield mineReadFile('./fs1.txt')
        console.log('fs1----'+fs1)
        let fs2 = yield mineReadFile('./fs2.txt')
        console.log('fs2-----'+fs2)
        let fs3 = yield mineReadFile('./fs3.txt')
        console.log('fs3----'+fs3)
    }
)



console.log(val instanceof Promise)//true
function async(main){
    var iter = main()
   //定义函数对生产器产生对每个值进行处理
    function handle(generatorres){
        if(generatorres.done) return;
        var val = generatorres.value
   //如果生成 的值是一个promise，则对其注册成功和失败回调。这是异步处理的部分。如果promise成功 返回，则恢复生成器的执行并传入promise的返回结果。
   //如果遇到错误，则向生成器抛出异常
        if (val instanceof Promise){
            val.then((r)=>{
                handle(iter.next(r))       
            }).catch(err => {iter.throw(err)})
        }    
    } 
    try {
        handle(iter.next())
    } catch (error) {
        iter.throw(error)
    }
}
//方法二 多次繁琐next（）
// function * main(){
//     console.log('start')
//     yield mineReadFile('./fs1.txt')
//     yield mineReadFile('./fs2.txt')
//     yield mineReadFile('./fs3.txt')

// }
// var main = main()
// main.next().value.then(r => {
//     console.log(r)
// },v => {
//     console.log(v)
// })
// main.next().value.then(r => {
//     console.log(r)
// },v => {
//     console.log(v)
// })
// main.next().value.then(r => {
//     console.log(r)
// },v => {
//     console.log(v)
// })


//async/await and generator

// async function * main(){
//     console.log('start')
//     res =[]
//     res.push( await mineReadFile('./fs1.txt'))
//     //yield console.log(fs1)
//     res.push(await mineReadFile('./fs2.txt'))
//     //yield console.log(fs1)
//     res.push(await mineReadFile('./fs3.txt'))
//     yield res
// }
// var main = main()
// main.next().then(val => {
//     console.log(val)
// })
// async function main(){
//     p1 = await mineReadFile('./fs1.txt')
//     console.log(p1)
//     p2 = await mineReadFile('./fs2.txt')
//     console.log(p2)
//     p3 = await mineReadFile('./fs3.txt')
//     console.log(p3)
   
// }
// main()







